package com.yuw.control;

import com.yuw.bean.AdminInfoBean;
import com.yuw.model.IAdminManagerModel;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 在springmvc中，使用注解@Controller表明这个是控制层的类
 */
@Controller
public class AdminManagerControl {

    /**
     * 注解是给jvm的注释：可以参与编译运行，也可以不参与编译运行；
     * Resource注解告诉jvm（jvm使用了spring框架来完成），
     * 此处需要给当前变量进行new赋值操作；
     * 约定：其一：可以使用参数名进行进行匹配；
     *
     * 上面描述的操作，都由spring框架进行承担；
     */
    /**
     * spring框架的ioc（反转控制）或di（依赖注入）
     * <p>
     * ioc（控制反转）：从spring的使用者的角度来说：
     * 本来当前类来使用new创建自己使用的类的实例对象，
     * 将创建所使用的类的实例对象的权限反转给spring框架来完成；
     * <p>
     * di（依赖注入）：从spring的角度来说：
     * spring框架在依赖注入的管理范围内（可以在配置文件中进行配置），
     * 把使用者需要使用的类的实例对象通过映射规则（按类型、按名字），
     * 注入给使用者所声明的变量；
     * （spring框架通过注入方式把使用者声明的变量进行了new初始化）
     * <p>
     * ioc和di是一种机制的两个维度的描述；
     */
    @Resource
    private IAdminManagerModel adminM;

    /**
     * 要求：
     * 方法中的参数需要和前台页面中的表单控件的
     * Name属性值保持一致；
     *
     * @ RequestMapping中的映射路径需要和
     * 前台请求页面中form表单的action属性一致；
     */
    @RequestMapping("/doLogining")
    public String doLogin(String adminName, String adminPsw) {
        // 查看从前台传入的数据
        System.out.println("用户名：" + adminName);
        System.out.println("用户名：" + adminPsw);
        // TODO 调用Model进行登录的业务逻辑处理
        // 根据Model层业务逻辑处理的结果，返回对应的视图解析的名字
        // WEB-INF/pages/logined.jsp
        return "logined";
    }

    /**
     * 映射要求：
     * 如果方法中的参数是一个实体类类型，则
     * 要求实体类的成员变量名和和前台页面中的表单控件的
     * Name属性值保持一致；
     */
    @RequestMapping("doLogining2")
    public String doLogin2(AdminInfoBean adminB) {
        // 查看从前台传入的数据
        System.out.println("用户名：" + adminB.getAdminname());
        System.out.println("用户名：" + adminB.getAdminpsw());
        // 调用Model进行登录的业务逻辑处理
        //IAdminManagerModel adminM = new AdminManagerModelImpl();
        // 调用业务逻辑层的登录验证方法
        boolean isLogined = adminM.doAdminLogin(adminB);
        // 根据Model层业务逻辑处理的结果，返回对应的视图解析的名字
        if (isLogined) {
            // 登录成功
            // 跳转到登录成功页面
            // WEB-INF/pages/logined.jsp
            return "logined";
        } else {
            // 登录失败
            // 跳转到登录页面重新进行登录
            return "../../index";
        }
    }

    /**
     * 新增管理员信息
     *
     * @param adminB
     * @return
     */
    @RequestMapping("addAdminInfo")
    public String saveAdminInfo(AdminInfoBean adminB, HttpServletRequest request) {
        // 默认返回值
        int ii = 0;
        // 调用model层进行管理员信息保存业务操作
        ii = adminM.saveAdminInfo(adminB);

        // 如果修改和新增是同一个页面，则提出修改时缓存的修改的实体类对象
        request.getSession().removeAttribute("modifyAdminB");

        // 根据操作结果进行不同视图的解析转发
        if (ii == 1) {
            // 保存成功
            /*
             因为要显示数据到前台页面，
             在保存成功之后，需要将要在前台页面显示的数据查询出来
              */
            // 调用medol业务逻辑层进行显示数据的查询操作
            List<AdminInfoBean> lstAdminB = adminM.selectAllAdminInfo();
            // 使用request缓存，进行数据传递
            // 使用request对象将后台的值传递给前台
            request.setAttribute("lstAdmins", lstAdminB);

            return "admininfo/admininfoAddDetail";
        } else {
            return "admininfo/admininfoAdd";
        }
    }

    /**
     * 新增管理员信息
     *
     * @param adminB
     * @return
     */
    @RequestMapping("queryAdminInfo")
    public String queryAdminInfo(AdminInfoBean adminB, HttpServletRequest request) {
        // 默认返回值
        int ii = 0;
        // 调用model层进行管理员信息查询业务操作
        List<AdminInfoBean> lstAdminB = adminM.selectAdminInfoByParams(adminB);
        // 使用缓存，将查询条件进行缓存，方便修改删除之后重新根据条件进行再次重新查询
        request.getSession().setAttribute("queryBean", adminB);
        // 使用request缓存，进行数据传递
        // 使用request对象将后台的值传递给前台
        request.setAttribute("lstQueryAdmins", lstAdminB);
        // 显示查询结果页面
        return "admininfo/admininfoQueryDetail";

    }

    /**
     * 删除管理员信息
     *
     * @param adminId 删除id
     * @return
     */
    @RequestMapping("deleteAdminInfo")
    public String deleteAdminInfo(Long adminId, HttpServletRequest request) {
        // 调用dao层进行删除操作
        int i = adminM.deleteByPrimaryKey(adminId);
        // 删除完了，显示剩余的数据记录
        // 重新查询数据库操作
        // 使用缓存，从缓存中将查询条件取出，以便按照之前的查询条件重新进行再次查询
        Object object = request.getSession().getAttribute("queryBean");
        AdminInfoBean adminB = new AdminInfoBean();
        // 调用查询操作
        adminB = object == null ? adminB : (AdminInfoBean) object;
        // 调用model层进行管理员信息查询业务操作
        List<AdminInfoBean> lstAdminB = adminM.selectAdminInfoByParams(adminB);
        // 使用request缓存，进行数据传递
        // 使用request对象将后台的值传递给前台
        request.setAttribute("lstQueryAdmins", lstAdminB);

        // 显示查询结果页面
        return "admininfo/admininfoQueryDetail";
    }

    /**
     * 请求修改管理员信息
     *
     * @param adminId 删除id
     * @return
     */
    @RequestMapping("modifyAdminInfo")
    public String modifyAdminInfo(Long adminId, HttpServletRequest request) {
        // 前台传到后台的是修改数据的id字段
        // 根据修改的id字段查询该记录所有数据
        // 调用model层进行数据查询
        AdminInfoBean adminB = adminM.selectByPrimaryKey(adminId);
        // 存入缓存，前台页面在form表单的value属性上使用el表达式进行显示
        request.getSession().setAttribute("modifyAdminB",adminB);
        // 调到修改页面
        return "admininfo/admininfoModify";
    }

}